//
//  WLiCarouselDelegate.m
//  舒睡
//
//  Created by 王亮 on 2021/9/24.
//  Copyright © 2021 舒睡. All rights reserved.
//

#import "WLiCarouselDelegate.h"

@implementation WLiCarouselDelegate

-(WLiCarouselModel *)viewModel{
    if (!_viewModel) {
        _viewModel = [[WLiCarouselModel alloc]init];
    }
    return _viewModel;
}
- (instancetype)initWithDelegate:(id)delegate
{
    self = [super init];
    if (self) {
        self.delegate = delegate;
    }
    return self;
}
#pragma mark - WLiCarouselDataSource 代理-
//返回carousel中界面的数量
- (NSInteger)numberOfItemsInCarousel:(WLiCarousel *)carousel{
    return [self.viewModel.item count];
}
//返回一个在carousel中要在指定索引处显示的视图，可以是UIImageView等，也可以自定义UIView
- (UIView *)carousel:(WLiCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(nullable UIView *)view{
    WLiCarouselRow *row = [self.viewModel.item objectAtIndex:index];
    if (view == nil) {
        if([self.delegate respondsToSelector:@selector(wl_carousel:viewForItemAtIndex:model:)]){
            view = [self.delegate wl_carousel:carousel viewForItemAtIndex:index model:row];
        } else {
            view = [[UIView alloc]init];
        }
        view.frame = CGRectMake(0, 0, row.rowSize.width, row.rowSize.height);
    }
    if([self.delegate respondsToSelector:@selector(wl_carousel:viewForItemAtIndex:model:reusingView:)]){
        [self.delegate wl_carousel:carousel viewForItemAtIndex:index model:row reusingView:view];
    }
    return view;
}
//返回在carousel中展示的占位视图数量。占位视图用来当carousel中界面太少而不能填满carousel的宽度，并且你希望在空白的地方显示一些东西时使用。它们随着carousel移动并且像其他carousel界面一样运行，但是它们不占numberOfItems数量，且不能被设置为当前选中的界面
- (NSInteger)numberOfPlaceholdersInCarousel:(WLiCarousel *)carousel{
    return 0;
}
//返回在carousel中展示的占位视图
- (UIView *)carousel:(WLiCarousel *)carousel placeholderViewAtIndex:(NSInteger)index reusingView:(nullable UIView *)view{
    return view;
}
/**
 1)WLiCarouselOptionWrap:
 一个布尔值，表示滚动条滚动到最后是否环绕。
 如果您希望carousel到达结束时环绕则返回YES，否则返回 NO。
 一般来说，循环carousel类型将默认为环绕，而线性转盘类型不会环绕。 不要担心返回类型是浮点值，因为除0.0之外的任何值都将被视为YES。

 2)WLiCarouselOptionShowBackfaces:
 对于某些carousel类型，例如 WLiCarouselTypeCylinder，
 可以看到某些视图的后侧（默认情况下，WLiCarouselTypeInvertedCylinder隐藏背面）。
 如果您希望隐藏后视图，您可以为此选项返回 NO。
 要重写WLiCarouselTypeInvertedCylinder的默认背景隐藏，
 可以返回YES。 此选项也可用于导致视图背面显示的自定义轮播转换。

 3)WLiCarouselOptionOffsetMultiplier:
 用户用手指拖动转盘时使用的偏移倍数。
 它不影响程序滚动或减速速度。
 对于大多数轮播类型，默认值为1.0，
 但对于CoverFlow样式的 carousel，默认值为2.0，
 以补偿其项目间隔更紧密的事实，
 因此必须进一步拖动以移动相同的距离。

 4)WLiCarouselOptionVisibleItems:
 这是一次应该在轮播中可见的视图（包括占位符）的最大数量。
 这一数量的一半视图将显示在当前所选项目索引的两边。
 超出该视图的视图在滚动到视图之前将不会被加载。
 这是考虑到carousel 中大量 item 会对性能产生不好的影响.。WLiCarousel根据轮播类型选择合适的默认值，如果您希望重写该值可以使用这个属性（例如，自定义的轮播类型）。

 5)WLiCarouselOptionCount:
 在 Rotary,Cylinder 和 Wheel 类型中显示的 item 的数量。
 通常，这是根据轮播中的视图大小和item 的数量自动计算的，
 但如果要更精确地控制carousel的显示，则可以重写此选项。
 该属性用于计算 carousel半径，因此另一个选项是直接操作半径。

 6)WLiCarouselOptionArc:
 Rotary，Cylinder和Wheel 类型的弧线转换（弧度）。
 通常默认为2 * M_PI（一个完整的圆），
 但您可以指定较小的值，因此例如，M_PI的值将创建一个半圆或圆柱。
 该属性用于计算圆盘传送带半径和角度步长，
 因此另一个选项是直接操作这些值。

 7)WLiCarouselOptionRadius:
 旋转，圆柱和轮的半径以像素/点转换。
 为了可见item显示的数量更好的适应特定的弧度,这个值通常被计算 。
 您可以操作该值来增加或减少项目间距（以及圆的半径）。

 8)WLiCarouselOptionAngle:
 Rotary，Cylinder和Wheel之间的每个项目之间的角度步长（以弧度表示）。 在不改变半径的情况下,在 carousel 滚动到最后时改变间隙或使item 交叠。

 9)WLiCarouselOptionTilt:
 tilt用于CoverFlow，CoverFlow2和TimeMachine的 carousel类型中的非居中项目。 该值应在0.0到1.0的范围内。

 10)WLiCarouselOptionSpacing:
 项目视图之间的间距。
 该值乘以项目宽度（或高度，如果carousel 是垂直的），
 以获得每个项目之间的总空间，
 因此值为1.0（默认值）表示视图之间没有空隙（除非视图已经包括填充，因为 他们在许多示例项目中做）。

 11)WLiCarouselOptionFadeMin/WLiCarouselOptionFadeMax/WLiCarouselOptionFadeRange:
 这三个选项根据它们与当前居中的item的偏移量来控制carousel的视图的淡出。
  FadeMin是item视图在开始淡入之前可以达到的最小负偏移量。 FadeMax是视图在开始淡化之前可以达到的最大正偏移量。
  FadeRange是项目可以在开始褪色的点与完全不可见的点之间移动的距离。
  
 */
- (CGFloat)carousel:(WLiCarousel *)carousel valueForOption:(WLiCarouselOption)option withDefault:(CGFloat)value {
    if (option == WLiCarouselOptionWrap){
        return self.viewModel.isWrap;
    }
    if (option == WLiCarouselOptionSpacing){
        return self.viewModel.isSpacing;
    }
    return value;
}

#pragma mark - WLiCarouselDelegate 代理-
//carousel将开始滚动动画
- (void)carouselWillBeginScrollingAnimation:(WLiCarousel *)carousel{
    
}
//carousel结束滚动动画
- (void)carouselDidEndScrollingAnimation:(WLiCarousel *)carousel{
    WLiCarouselRow *row = [self.viewModel.item objectAtIndex:carousel.scrollOffset];
    if([self.delegate respondsToSelector:@selector(wl_carouselDidEndScrollingAnimation:index:row:)]){
        [self.delegate wl_carouselDidEndScrollingAnimation:carousel index:carousel.scrollOffset row:row];
    }
}
//carousel滚动
- (void)carouselDidScroll:(WLiCarousel *)carousel{
    
}
//carousel变化
- (void)carouselCurrentItemIndexDidChange:(WLiCarousel *)carousel{
    
}
//开始拖动carousel
- (void)carouselWillBeginDragging:(WLiCarousel *)carousel{
    
}
//停止拖动carousel
- (void)carouselDidEndDragging:(WLiCarousel *)carousel willDecelerate:(BOOL)decelerate{
    
}
//carousel开始减速
- (void)carouselWillBeginDecelerating:(WLiCarousel *)carousel{
    
}
//carousel完成减速
- (void)carouselDidEndDecelerating:(WLiCarousel *)carousel{
    
}

//将要点击carousel视图触发该方法
- (BOOL)carousel:(WLiCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index{
    WLiCarouselRow *row = [self.viewModel.item objectAtIndex:index];
    if([self.delegate respondsToSelector:@selector(wl_carousel:shouldSelectItemAtIndex:row:)]){
        return [self.delegate wl_carousel:carousel shouldSelectItemAtIndex:index row:row];
    }
    return true;
}
//点击carousel视图触发该方法，类似于tableView:didSelectRowAtIndexPath:方法
- (void)carousel:(WLiCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{
    WLiCarouselRow *row = [self.viewModel.item objectAtIndex:index];
    if([self.delegate respondsToSelector:@selector(wl_carousel:didSelectItemAtIndex:row:)]){
        [self.delegate wl_carousel:carousel didSelectItemAtIndex:index row:row];
    }
}

@end
